package controller

import (
	"backendChat/models"
	"backendChat/utils"
	"fmt"
	"net/http"
	"strconv"

	"github.com/gin-gonic/gin"
)

type LoginParamsJson struct {
	Name     string `json:"name"`
	Password string `json:"password"`
}

// @BasePath /api/v1
// @Summary 用户登录
// @Tags 用户模块
// @param name formData string true "账号"
// @param password formData string true "密码"
// @Success 200 {object} utils.H{data=object}
// @Router /user/login [post]
func Login(c *gin.Context) {
	// 获取参数
	var params LoginParamsJson
	err := c.BindJSON(&params)
	if err != nil {
		utils.RespFail(c.Writer, "账号密码错误，请重新输入")
		return
	}
	// 获取DB库中的数据
	dbuser := models.FindUserByName(params.Name)
	fmt.Println(params)
	// 如果无值
	if dbuser.Name == "" {
		utils.RespFail(c.Writer, "用户未注册，请先注册")
		return
	}
	// 密码错误
	if !utils.ComparePasswords(dbuser.Password, params.Password) {
		utils.RespFail(c.Writer, "账号密码错误，请重新输入")
		return
	}
	user := models.CopyUserInfoClient(dbuser)
	user.Token, _ = utils.CreateJWTStr(dbuser.ID, dbuser.Name)
	// 成功
	utils.RespOk(c.Writer, user)
}

type RegistryParamsJson struct {
	Name       string `json:"name"`
	Password   string `json:"password"`
	Repassword string `json:"repassword"`
	Email      string `json:"email"`
	Nickname   string `json:"nickname"`
}

// @BasePath /api/v1
// @Summary 用户注册
// @Tags 用户模块
// @param name formData string true "账号"
// @param password formData string true "密码"
// @param repassword formData string true "确认密码"
// @param realName formData string false "真实姓名"
// @param birthday formData string false "生日"
// @param role formData string false "角色"
// @Success 200 {object} utils.H{data=string}
// @Router /user/registry [post]
func CreateUser(c *gin.Context) {
	// 实例化 UserBasic 结构体
	user := models.UserBasic{}
	var params RegistryParamsJson
	// 获取参数
	err := c.BindJSON(&params)
	if err != nil {
		fmt.Println(err)
		utils.RespFail(c.Writer, "账号密码错误")
		return
	}
	fmt.Println("name:", params)
	if params.Name == "" || params.Password == "" {
		utils.RespFail(c.Writer, "账号密码错误")
		return
	}
	if params.Password != params.Repassword {
		utils.RespFail(c.Writer, "两次密码不一致")
		return
	}
	hashPassword, _ := utils.HashPassword(params.Password)
	fmt.Println(hashPassword)
	// 判断是否已有该数据
	data := models.FindUserByName(params.Name)
	if data.Name != "" {
		utils.RespFail(c.Writer, "用户已注册")
	} else {
		// 将数据赋值到实例中
		user.Name = params.Name
		user.Password = hashPassword
		// 将值存入DB中
		dbuser := models.CreateUser(user)
		tokenStr, err := utils.CreateJWTStr(dbuser.ID, dbuser.Name)
		if err != nil {
			utils.RespFail(c.Writer, "token无效")
		} else {
			// 存入DB表中
			utils.RespOk(c.Writer, tokenStr)
		}
	}
}

// @BasePath /api/v1
// @Summary 删除用户
// @param X-Csrf-Token header string true "token"
// @Tags 用户模块
// @Success 200 {object} utils.H{data=nil}
// @Router /user/delete [post]
func DeleteUser(c *gin.Context) {
	user := models.UserBasic{}
	id := c.MustGet("userId").(uint)
	user.ID = id
	models.DeleteUser(user)
	utils.RespOk(c.Writer, nil)
	// c.JSON(http.StatusOK, gin.H{
	// 	"code": 210,
	// 	"msg":  "删除用户成功",
	// })
}

// @BasePath /api/v1
// @Summary 更新用户数据
// @Tags 用户模块
// @param X-Csrf-Token header string true "token"
// @param age formData int64 true "age"
// @param realName formData string true "realName"
// @param address formData string false "address"
// @Success 200 {object} utils.H{data=nil}
// @Router /user/modify [post]
func ModifyUser(c *gin.Context) {
	user := models.UserBasic{}
	id := c.MustGet("userId").(uint)
	addr := c.PostForm("address")
	realName := c.PostForm("realName")
	age, _ := strconv.Atoi(c.PostForm("age"))
	user.ID = id
	user.Address = addr
	user.RealName = realName
	user.Age = age
	models.ModifyUser(user)
	utils.RespOk(c.Writer, nil)
	// c.JSON(http.StatusOK, gin.H{
	// 	"code": 210,
	// 	"msg":  "更新成功",
	// })
}

// @BasePath /api/v1
// @Summary 用户列表
// @Tags 用户模块
// @param X-Csrf-Token header string true "token"
// @Success 200 {object} utils.HLIST{data=[]object}
// @Router /user/list [get]
func GetList(c *gin.Context) {
	data := models.GetUserList()
	fmt.Println(data)
	utils.RespOkList(c.Writer, data, 1)
	// c.JSON(http.StatusOK, gin.H{
	// 	"code": 210,
	// 	"msg":  "获取数据成功",
	// 	"data": data,
	// })
}

// @BasePath /api/v1
// @Summary 登录密码更新
// @Tags 用户模块
// @param oldPassword formData string true "oldPassword"
// @param password formData string true "password"
// @param repassword formData string true "repassword"
// @Success 200 {object} utils.H{data=nil}
// @Router /user/updataPassword [post]
func UpdatePassword(c *gin.Context) {
	user := models.UserBasic{}
	id := c.MustGet("userId").(uint)
	dbuser := models.FindUserById(id)
	oldPassword := c.PostForm("oldPassword")
	password := c.PostForm("password")
	repassword := c.PostForm("repassword")
	if password != repassword {
		c.JSON(http.StatusBadRequest, gin.H{
			"code": -2,
			"msg":  "两次密码不一致",
		})
	}
	// 加密对比
	if !utils.ComparePasswords(dbuser.Password, oldPassword) {
		c.JSON(http.StatusBadRequest, gin.H{
			"code": -2,
			"msg":  "密码错误",
		})
	}
	user.ID = id
	user.Password, _ = utils.HashPassword(password)
	models.ModifyUser(user)
	c.JSON(http.StatusOK, gin.H{
		"code": 210,
		"msg":  "更新成功",
	})
}
